﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DSA4_Heldenerstellung
{
    public partial class Hauptfenster : Form
    {
        public Hauptfenster()
        {
            InitializeComponent();
            Held = new Held_C();
        }

        private Held_C Held;

        /// <summary>
        /// Diese Funktion wird gestartet, wenn die Rasse ausgewählt wird
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBox_Rasse_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoescheRasseFelder();

            Held.Rasse = Held.Rassen.Find(delegate(Rasse_C r) { return r.Name == comboBox_Rasse.SelectedItem.ToString(); });

            if (Held.Rasse != null)
            {
                textBox_GPRasse.Text = Held.Rasse.Grundpunkte.ToString();
                InitHaarfarbe();
                InitAugenfarbe();
                InitGroesse();
                InitGewicht();
                InitRasseKulturen();
                InitRasseModifikatoren();
                InitRasseTalente();
                InitRasseVorNachteile();
                pictureBox_Rasse.ImageLocation = Held.Rasse.PortraitPfad;
                textBox_RasseInfo.Text = Held.Rasse.Info;
                textBox_RasseBesonderheiten.Text = Held.Rasse.Besonderheiten;
            }
        }

        private void LoescheRasseFelder()
        {
            comboBox_RasseHaarfarbe.Text = "";
            comboBox_RasseAugenfarbe.Text = "";
            maskedTextBox_RasseGewicht.Text = "";
            maskedTextBox_RasseGroesse.Text = "";
            pictureBox_Rasse.Image = null;
            textBox_RasseBesonderheiten.Text = "";
            textBox_RasseInfo.Text = "";
            listBox_RasseAutoNachteile.Items.Clear();
            listBox_RasseAutoVorteile.Items.Clear();
            listBox_RasseEmpfohleneNachteile.Items.Clear();
            listBox_RasseEmpfohleneVorteile.Items.Clear();
            listBox_RasseKulturen.Items.Clear();
            listBox_RasseUngeeigneteNachteile.Items.Clear();
            listBox_RasseUngeeigneteVorteile.Items.Clear();
            dataGridView_RasseModifikatoren.Rows.Clear();
            dataGridView_RasseTalente.Rows.Clear();

        }

        private void InitHaarfarbe()
        {
            comboBox_RasseHaarfarbe.Enabled = true;
            button_RasseHaarfarbeZufall.Enabled = true;
            comboBox_RasseHaarfarbe.Items.Clear();
            comboBox_RasseHaarfarbe.Text = "";
            comboBox_RasseHaarfarbe.Items.AddRange(Held.Rasse.HaarfarbeDict.Keys.ToArray());
        }

        private void InitAugenfarbe()
        {
            comboBox_RasseAugenfarbe.Enabled = true;
            button_RasseAugenfarbeZufall.Enabled = true;
            comboBox_RasseAugenfarbe.Items.Clear();
            comboBox_RasseAugenfarbe.Text = "";
            comboBox_RasseAugenfarbe.Items.AddRange(Held.Rasse.AugenfarbeDict.Keys.ToArray());
        }

        private void InitGroesse()
        {
            maskedTextBox_RasseGroesse.Enabled = true;
            maskedTextBox_RasseGroesse.Text = "";
            button_RasseGroesseZufall.Enabled = true;
        }

        private void InitGewicht()
        {
            maskedTextBox_RasseGewicht.Text = "";
            maskedTextBox_RasseGewicht.Enabled = true;
            button_RasseGewicht.Enabled = true;
        }

        private void InitRasseModifikatoren()
        {
            dataGridView_RasseModifikatoren.Rows.Clear();

            foreach (String item in Held.Rasse.ModifikatorDict.Keys)
            {
                dataGridView_RasseModifikatoren.Rows.Add(item, Held.Rasse.ModifikatorDict[item]);
            }
        }

        private void InitRasseTalente()
        {
            dataGridView_RasseTalente.Rows.Clear();

            foreach (String item in Held.Rasse.TalenteDict.Keys)
            {
                dataGridView_RasseTalente.Rows.Add(item, Held.Rasse.TalenteDict[item]);
            }
        }

        private void InitRasseVorNachteile()
        {
            listBox_RasseAutoVorteile.Items.Clear();
            listBox_RasseAutoVorteile.Items.AddRange(Held.Rasse.AutoVorteile.ToArray());

            listBox_RasseAutoNachteile.Items.Clear();
            listBox_RasseAutoNachteile.Items.AddRange(Held.Rasse.AutoNachteile.ToArray());

            listBox_RasseEmpfohleneVorteile.Items.Clear();
            listBox_RasseEmpfohleneVorteile.Items.AddRange(Held.Rasse.EmpfohleneVorteile.ToArray());

            listBox_RasseEmpfohleneNachteile.Items.Clear();
            listBox_RasseEmpfohleneNachteile.Items.AddRange(Held.Rasse.EmpfohleneNachteile.ToArray());

            listBox_RasseUngeeigneteVorteile.Items.Clear();
            listBox_RasseUngeeigneteVorteile.Items.AddRange(Held.Rasse.UngeeigneteVorteile.ToArray());

            listBox_RasseUngeeigneteNachteile.Items.Clear();
            listBox_RasseUngeeigneteNachteile.Items.AddRange(Held.Rasse.UngeeigneteNachteile.ToArray());

            FuegeZuErworbenenVorteilen();
            FuegeZuErworbenenNachteilen();
        }

        private void InitRasseKulturen()
        {
            Held.VerarbeiteKulturen();
            listBox_RasseKulturen.Items.Clear();
            comboBox_KulturKultur.Items.Clear();
            Kultur_C[] Kulturen = Held.Kulturen.ToArray();

            foreach (Kultur_C Item in Kulturen)
            {
                listBox_RasseKulturen.Items.Add(Item.Name);
                comboBox_KulturKultur.Items.Add(Item.Name);
            }
        }

        private void FuegeZuErworbenenVorteilen()
        {
            string s;
            DataGridViewRowCollection reihe = dataGridView_VorNachteileErworbeneVorteile.Rows;

            reihe.Clear();
            for (int i = 0; i < listBox_RasseAutoVorteile.Items.Count; i++)
            {
                s = listBox_RasseAutoVorteile.Items[i].ToString();
                if (s != "")
                {
                    reihe.Add();
                    reihe[reihe.Count - 1].Cells[0].Value = s;
                    reihe[reihe.Count - 1].Cells[1].Value = "0";
                    reihe[reihe.Count - 1].DefaultCellStyle.BackColor = System.Drawing.Color.Lime;
                }
            }

            for (int i = 0; i < listBox_KulturAutoVorteile.Items.Count; i++)
            {
                s = listBox_KulturAutoVorteile.Items[i].ToString();
                if (s != "")
                {
                    reihe.Add();
                    reihe[reihe.Count - 1].Cells[0].Value = s;
                    reihe[reihe.Count - 1].Cells[1].Value = "0";
                    reihe[reihe.Count - 1].DefaultCellStyle.BackColor = System.Drawing.Color.Lime;
                }
            }
        }

        private void FuegeZuErworbenenNachteilen()
        {
            string s;
            DataGridViewRowCollection reihe = dataGridView_VorNachteileErworbeneNachteile.Rows;

            reihe.Clear();
            for (int i = 0; i < listBox_RasseAutoNachteile.Items.Count; i++)
            {
                s = listBox_RasseAutoNachteile.Items[i].ToString();
                if (s != "")
                {
                    reihe.Add();
                    reihe[reihe.Count - 1].Cells[0].Value = s;
                    reihe[reihe.Count - 1].Cells[1].Value = "0";
                    reihe[reihe.Count - 1].DefaultCellStyle.BackColor = System.Drawing.Color.Lime;
                }
            }

            for (int i = 0; i < listBox_KulturAutoNachteile.Items.Count; i++)
            {
                s = listBox_KulturAutoNachteile.Items[i].ToString();
                if (s != "")
                {
                    reihe.Add();
                    reihe[reihe.Count - 1].Cells[0].Value = s;
                    reihe[reihe.Count - 1].Cells[1].Value = "0";
                    reihe[reihe.Count - 1].DefaultCellStyle.BackColor = System.Drawing.Color.Lime;
                }
            }
        }

        private void button_RasseHaarfarbeZufall_Click(object sender, EventArgs e)
        {
            comboBox_RasseHaarfarbe.Text = Held.Rasse.Haarfarbe;
        }

        private void button_RasseAugenfarbeZufall_Click(object sender, EventArgs e)
        {
            comboBox_RasseAugenfarbe.Text = Held.Rasse.Augenfarbe;
        }

        private void button_RasseGroesseZufall_Click(object sender, EventArgs e)
        {
            maskedTextBox_RasseGroesse.Text = Held.Rasse.Groesse;
        }

        private void button_RasseGewicht_Click(object sender, EventArgs e)
        {
            if (maskedTextBox_RasseGroesse.MaskCompleted)
            {
                maskedTextBox_RasseGewicht.Text = Held.Rasse.BerechneGewicht(maskedTextBox_RasseGroesse.Text);
            }         
        }

        private void GPGesamtBerechnen(object sender, EventArgs e)
        {
            if (!maskedTextBox_GP.MaskCompleted)
            {
                maskedTextBox_GP.Text = "0";
            }
            textBox_GPVerbleibend.Text = (
                Convert.ToInt16(maskedTextBox_GP.Text) -
                Convert.ToInt16(textBox_GPRasse.Text) -
                Convert.ToInt16(textBox_GPKultur.Text) -
                Convert.ToInt16(textBox_GPProfession.Text) -
                Convert.ToInt16(textBox_GPVorNachteile.Text) -
                Convert.ToInt16(textBox_Sonderfertigkeiten.Text)
                ).ToString();
        }

        private void dataGridView_VorNachteileErworbeneVorteile_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            int gesamt = 0;
            for (int i = 0; i < dataGridView_VorNachteileErworbeneVorteile.RowCount; i++)
            {
                gesamt = gesamt + Convert.ToInt32(dataGridView_VorNachteileErworbeneVorteile.Rows[i].Cells[1].Value);
            }
            textBox_VorNachteileErworbeneVorteileKosten.Text = gesamt.ToString();
        }

        private void dataGridView_VorNachteileErworbeneNachteile_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            int gesamt = 0;
            for (int i = 0; i < dataGridView_VorNachteileErworbeneNachteile.RowCount; i++)
            {
                gesamt = gesamt + Convert.ToInt32(dataGridView_VorNachteileErworbeneNachteile.Rows[i].Cells[1].Value);
            }
            textBox_VorNachteileErworbeneNachteileKosten.Text = gesamt.ToString();
        }

        private void button_VorNachteileNachteileHinzu_Click(object sender, EventArgs e)
        {
            if (dataGridView_VorNachteileVorteile.SelectedRows.Count == 1)
            {

            }
            else
            {
                MessageBox.Show("Fehler, ungültige Auswahl");
            }
        }

        private void button_VorNachteileNachteilWeg_Click(object sender, EventArgs e)
        {
            if (dataGridView_VorNachteileNachteile.SelectedRows.Count == 1)
            {

            }
            else
            {
                MessageBox.Show("Fehler, ungültige Auswahl");
            }
        }

        private void GPKostenVorNachteileBerechnen(object sender, EventArgs e)
        {
            if ((textBox_VorNachteileErworbeneVorteileKosten.Text != "") && (textBox_VorNachteileErworbeneNachteileKosten.Text != ""))
            {
                Int32 summe = Convert.ToInt32(textBox_VorNachteileErworbeneVorteileKosten.Text) + Convert.ToInt32(textBox_VorNachteileErworbeneNachteileKosten.Text);
                textBox_GPVorNachteile.Text = summe.ToString();
            }
        }

        private void dataGridView_VorNachteile_SelectionChanged(object sender, EventArgs e)
        {
            if (sender != dataGridView_VorNachteileNachteile)
            {
                dataGridView_VorNachteileNachteile.ClearSelection();
            }
            if (sender != dataGridView_VorNachteileVorteile)
            {
                dataGridView_VorNachteileVorteile.ClearSelection();
            }
            if (sender != dataGridView_VorNachteileErworbeneNachteile)
            {
                dataGridView_VorNachteileErworbeneNachteile.ClearSelection();
            }
            if (sender != dataGridView_VorNachteileErworbeneVorteile)
            {
                dataGridView_VorNachteileErworbeneVorteile.ClearSelection();
            }

        }

        private void comboBox_KulturKultur_SelectedIndexChanged(object sender, EventArgs e)
        {
            String kultur = comboBox_KulturKultur.Text;

            LoescheFelderKultur();

            if (kultur == "Novadi")
            {
                if (comboBox_Geschlecht.Text != "")
                {
                    kultur = kultur + " (" + comboBox_Geschlecht.Text + ")";
                }
                else
                {
                    MessageBox.Show("Die Startwerte für Novadis sind abhängig vom Geschlecht");
                    comboBox_KulturKultur.SelectedIndex = 0;
                }
                
            }

            Held.Kultur = Held.Kulturen.Find(delegate(Kultur_C k) { return k.Name == kultur; });

            if (Held.Kultur != null)
            {
                pictureBox_KulturPortrait.ImageLocation = Held.Kultur.PortraitPfad;
                InitKulturProfessionen();
                textBox_KulturInfo.Text = Held.Kultur.Info;
            }
        }

        private void LoescheFelderKultur()
        {
            pictureBox_KulturPortrait.Image = null;
            listBox_KulturProfessionen.Items.Clear();
            listBox_KulturSF.Items.Clear();
            listBox_KulturSFVerguenstigt.Items.Clear();
            listBox_KulturUngeeigneteNachteile.Items.Clear();
            listBox_KulturUngeeigneteVorteile.Items.Clear();
            dataGridView_KulturEigenschaften.Rows.Clear();
            dataGridView_KulturTalente.Rows.Clear();
            textBox_KulturInfo.Text = "";
        }

        private void InitKulturProfessionen()
        {
            Profession_C[] Professionen = Held.Professionen.ToArray();
            listBox_KulturProfessionen.Items.Clear();

            foreach (Profession_C Item in Professionen)
            {
                listBox_KulturProfessionen.Items.Add(Item.Name);
            }
        }

        private void textBox_Name_TextChanged(object sender, EventArgs e)
        {
            Held.Name = textBox_Name.Text;
        }

        private void maskedTextBox_GP_TextChanged(object sender, EventArgs e)
        {
            Held.Grundpunkte = Convert.ToInt16(maskedTextBox_GP.Text);
        }

        private void comboBox_Geschlecht_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox_KulturKultur.Text != "Novadi")
            {
                Held.Geschlecht = comboBox_Geschlecht.Text;
            }
            else
            {
                MessageBox.Show("Das Ändern des Geschlechts für Novadi wirkt sich auf die Rasse aus.\nÄnderung nicht übernommen");
            }
        }
    }
}
